
namespace ShoppingCart.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
    using Microsoft.Practices.EnterpriseLibrary.Data;
	using ShoppingCart.Business.Entity;

	/// <summary>
	/// Represents the DataAccess of DistritoData.
	/// </summary>
	public class DistritoData : Singleton<DistritoData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

		#region Methods

		/// <summary>
		/// Selects all records from the Distrito table by a foreign key.
		/// </summary>
		public Distrito Obtener(int idDistrito)
		{
			var distrito = default(Distrito);
			var comando = BaseDatos.GetStoredProcCommand("SelectDistrito");

			BaseDatos.AddInParameter(comando, "IdDistrito", DbType.Int32, idDistrito);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
                    distrito = new Distrito
                    {
                        IdDistrito = lector.GetInt32(lector.GetOrdinal("IdDistrito")),
                        Provincia = ProvinciaData.Instancia.Obtener(lector.GetInt32(lector.GetOrdinal("IdProvincia"))),
                        Nombre = lector.GetString(lector.GetOrdinal("Nombre")),
                        Flete = lector.IsDBNull(lector.GetOrdinal("Flete")) ? 0 : lector.GetDecimal(lector.GetOrdinal("Flete")),
                        Estado = lector.GetBoolean(lector.GetOrdinal("Estado"))
                    };
				}
			}
			comando.Dispose();
			return distrito;
		}

		/// <summary>
		/// Saves a record to the Distrito table.
		/// </summary>
		public int Agregar(Distrito distrito)
		{
			var comando = BaseDatos.GetStoredProcCommand("InsertDistrito");
			BaseDatos.AddInParameter(comando, "IdDistrito", DbType.Int32, distrito.IdDistrito);
			BaseDatos.AddInParameter(comando, "IdProvincia", DbType.Int32, distrito.Provincia.IdProvincia);
			BaseDatos.AddInParameter(comando, "Nombre", DbType.String, distrito.Nombre);
		    BaseDatos.AddInParameter(comando, "Flete", DbType.Decimal, distrito.Flete);
			BaseDatos.AddInParameter(comando, "Estado", DbType.Boolean, distrito.Estado);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Agregar Distrito.");

			comando.Dispose();
			return 1;
		}

		/// <summary>
		/// Updates a record in the Distrito table.
		/// </summary>
		public bool Modificar(Distrito distrito)
		{
			var comando = BaseDatos.GetStoredProcCommand("UpdateDistrito");
			BaseDatos.AddInParameter(comando, "IdDistrito", DbType.Int32, distrito.IdDistrito);
			BaseDatos.AddInParameter(comando, "IdProvincia", DbType.Int32, distrito.Provincia.IdProvincia);
			BaseDatos.AddInParameter(comando, "Nombre", DbType.String, distrito.Nombre);
		    BaseDatos.AddInParameter(comando, "Flete", DbType.Decimal, distrito.Flete);
			BaseDatos.AddInParameter(comando, "Estado", DbType.Boolean, distrito.Estado);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Modificar Distrito.");

			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the Distrito table by its primary key.
		/// </summary>
		public bool Eliminar(int idDistrito)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDistrito");
			BaseDatos.AddInParameter(comando, "IdDistrito", DbType.Int32, idDistrito);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Distrito.");
			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the Distrito table by a foreign key.
		/// </summary>
		public void EliminarPorIdProvincia(int idProvincia)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDistritoByIdProvincia");
			BaseDatos.AddInParameter(comando, "IdProvincia", DbType.Int32, idProvincia);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Distrito.");
			comando.Dispose();
		}

		/// <summary>
		/// Selects all records from the Distrito table by a foreign key.
		/// </summary>
		public IList<Distrito> ListarPorIdProvincia(int idProvincia)
		{
			var entidades = new List<Distrito>();
			var comando = BaseDatos.GetStoredProcCommand("SelectDistritoByIdProvincia");

			BaseDatos.AddInParameter(comando, "IdProvincia", DbType.Int32, idProvincia);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
                    entidades.Add(new Distrito
                    {
                        Provincia = ProvinciaData.Instancia.Obtener(idProvincia),
                        IdDistrito = lector.GetInt32(lector.GetOrdinal("IdDistrito")),
                        Nombre = lector.GetString(lector.GetOrdinal("Nombre")),
                        Flete = lector.IsDBNull(lector.GetOrdinal("Flete")) ? 0 : lector.GetDecimal(lector.GetOrdinal("Flete")),
                        Estado = lector.GetBoolean(lector.GetOrdinal("Estado"))
                    });
				}
			}
			comando.Dispose();
			return entidades;
		}

		#endregion
	}
}
